//////////////////////////////////////////////////////////////////////////
// IO Control Codes
//////////////////////////////////////////////////////////////////////////
#define IOCTL_GET_KPCR_ADR				CTL_CODE_AST(10)
#define IOCTL_READ_MEMORY				CTL_CODE_AST(100)
#define IOCTL_WRITE_MEMORY				CTL_CODE_AST(150)
#define IOCTL_INVOKE_FUNCTION			CTL_CODE_AST(200)

//////////////////////////////////////////////////////////////////////////
// Functions
//////////////////////////////////////////////////////////////////////////
BOOLEAN ProcessIoCtlForCommon(ULONG ioControlCode, PDEVICE_OBJECT deviceObject, PIRP irp, PIO_STACK_LOCATION irpStack);

VOID ProcessGetKpcrAdr(PIRP irp);
VOID ProcessReadMemory(PIRP irp);
VOID ProcessWriteMemory(PIRP irp);
VOID ProcessInvokeFunction(PIRP irp);

PVOID GetFunctionAddess(PCWSTR FunctionName);

//////////////////////////////////////////////////////////////////////////
// Structures
//////////////////////////////////////////////////////////////////////////
typedef struct _READ_MEMORY_REQUEST {
	ULONG_PTR Address;
	ULONG Length;
} READ_MEMORY_REQUEST, *PREAD_MEMORY_REQUEST;

typedef struct _WRITE_MEMORY_REQUEST {
	ULONG_PTR Address;
	ULONG Length;
	ULONG_PTR Value;
} WRITE_MEMORY_REQUEST, *PWRITE_MEMORY_REQUEST;

typedef struct _INVOKE_FUNCTION_REQUEST {
	WCHAR FunctionName[64];
	ULONG ParamCount;
	ULONG_PTR Params[20];
	ULONG ReturnSize;
	BOOLEAN IsReturnValueType;
} INVOKE_FUNCTION_REQUEST, *PINVOKE_FUNCTION_REQUEST;
